// 给定一个整数数组  nums，求出数组从索引 i 到 j（i ≤ j）范围内元素的总和，包含 i、j 两点。

// 实现 NumArray 类：

// NumArray(int[] nums) 使用数组 nums 初始化对象
// int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j（i ≤ j）范围内元

class NumArray {
    private readonly preSum: number[];
    constructor(nums: number[]) {
        this.preSum = new Array(nums.length + 1).fill(0);// 处理边界情况
        for (let i = 1; i < this.preSum.length; i++) {
            this.preSum[i] = this.preSum[i - 1] + nums[i - 1];
        }
    }

    sumRange(i: number, j: number): number {
        return this.preSum[j + 1] - this.preSum[i];
    }
}

// 比较巧妙的一道题，对于每次使用sumRange方法而言，遍历求和似乎变为一个昂贵的操作
// 所以这里想到一个巧妙地做法是在初始化时就求出前缀和，让sumRange转换为一个O1操作
// 前缀和的意义是值得在数学上思考的，preSum[i] - preSum[i - 1]实际上可以求出nums[i]
// 利用这个特性这道题目就可以迎刃而解，值得注意的是边界情况的考虑，preSum在初始化时理应多一个元素